热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

表盘|分针_android绘制时钟,canvas学习

篇首语:本文由编程笔记#小编为大家整理,主要介绍了android绘制时钟,canvas学习相关的知识,希望对你有一定的参考价值。自定义View,新建Clic

篇首语:本文由编程笔记#小编为大家整理,主要介绍了android绘制时钟,canvas学习相关的知识,希望对你有一定的参考价值。


自定义View,新建ClickView类继承View


import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import androidx.annotation.Nullable;
public class ClickView extends View
private Paint paint; //表盘外框
private Paint paint1_1; //表中心
private Paint paint2; //表数字
private Paint paint3;//表时针
private Paint paint4;//表分针
private Integer SHI = 0 ;//时
private Integer FEN = 0;//分
private Integer lining = 100; //表盘半径
private Integer lining_sf = 25; //表内径距离
public ClickView(Context context)
super(context);

public ClickView(Context context, @Nullable AttributeSet attrs)
super(context, attrs);

public ClickView(Context context, @Nullable AttributeSet attrs, int defStyleAttr)
super(context, attrs, defStyleAttr);

public ClickView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes)
super(context, attrs, defStyleAttr, defStyleRes);

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
super.onMeasure(widthMeasureSpec, heightMeasureSpec);

//外部方法,设置时间并刷新
public void setSHIandFEN(Integer a,Integer b)
this.SHI = a;
this.FEN = b;
//刷新
invalidate();

//绘制
public void onDraw(Canvas canvas)
super.onDraw(canvas);
//初始化
ini();
//画布移动到中心点 画表盘
canvas.translate(getWidth()/2,getHeight()/2);
canvas.drawCircle(0,0,lining,paint);
draw_ini(canvas);
//画时针,分针
setFen(FEN,canvas);
setShi(SHI,FEN,canvas);
//画空心表中心
// canvas.drawOval(new RectF(-5,-5,5,5),paint);
//画实心表中心
paint1_1 = new Paint();
paint1_1.setColor(Color.RED);
paint1_1.setAntiAlias(true);
paint1_1.setStyle(Paint.Style.FILL_AND_STROKE);
paint1_1.setStrokeWidth(3);
canvas.drawCircle(0,0,10,paint1_1);


//初始化笔刷
protected void ini()
paint = new Paint();
paint.setColor(Color.RED);
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(3);
paint2 = new Paint();
paint2.setColor(Color.BLUE);
paint2.setAntiAlias(true);
paint2.setStyle(Paint.Style.STROKE);
paint2.setStrokeWidth(1);
paint3 = new Paint();
paint3.setColor(Color.GREEN);
paint2.setAntiAlias(true);
paint3.setStyle(Paint.Style.STROKE);
paint3.setStrokeWidth(3);
paint4 = new Paint();
paint4.setColor(Color.GREEN);
paint4.setAntiAlias(true);
paint4.setStyle(Paint.Style.STROKE);
paint4.setStrokeWidth(2);

//画表盘 ,通过旋转画布实现
protected void draw_ini(Canvas canvas)
canvas.rotate(180,0,0);
for(int i&#61;0;i<60;i&#43;&#43;)
if(i%5&#61;&#61;0)
canvas.drawLine(0,lining,0,lining-12,paint);
if(i&#61;&#61;0)
canvas.drawText(String.valueOf(12),-4f, lining&#43;12f, paint2);
else
canvas.drawText(String.valueOf(i/5),-4f, lining&#43;12f, paint2);

else
canvas.drawLine(0,lining,0,lining-6,paint);

canvas.rotate(6,0,0);


//画时针分针&#xff0c;通过旋转画布实现
private void setShi(Integer SHI,Integer FEN,Canvas canvas)
canvas.save();
if(SHI>&#61;12)SHI-&#61;12;
if(SHI&#61;&#61;0||SHI&#61;&#61;12)
canvas.drawLine(0,0,0,lining-lining_sf-20,paint3);
else
Integer degree &#61; SHI*30&#43;FEN/2;
canvas.rotate(degree,0,0);
canvas.drawLine(0,0,0,lining-lining_sf-20,paint3);

canvas.restore();

private void setFen(Integer FEN,Canvas canvas)
canvas.save();
if(FEN&#61;&#61;0||FEN&#61;&#61;60)
canvas.drawLine(0,0,0,lining-lining_sf,paint4);
else
Integer degree &#61; FEN*6;
canvas.rotate(degree,0,0);
canvas.drawLine(0,0,0,lining-lining_sf,paint4);

canvas.restore();

外部调用
xml文件

android:orientation&#61;"vertical"
android:layout_width&#61;"match_parent"
android:layout_height&#61;"match_parent"
android:background&#61;"#fff"
>
//此处的包名按自己的来
android:id&#61;"&#64;&#43;id/click1"
android:layout_width&#61;"300dp"
android:layout_height&#61;"300dp"
android:layout_marginRight&#61;"50dp"/>
android:layout_width&#61;"wrap_content"
android:layout_height&#61;"wrap_content"
android:id&#61;"&#64;&#43;id/a1"/>

Button a1 &#61; findViewById(R.id.a1);
a1.setOnClickListener(new View.OnClickListener()
&#64;Override
public void onClick(View v)
//外部调用
ClickView view &#61; findViewById(R.id.a9);
view.setSHIandFEN(10,51);

);


推荐阅读
  • 本文深入解析了如何通过自定义 ViewGroup 实现类似支付宝风格的酷炫雷达脉冲动画效果。文章详细介绍了自定义 ViewGroup 的原理和实现步骤,并结合实际案例展示了如何在 Android UI 设计中应用这一技术,为开发者提供了宝贵的参考和实践指导。 ... [详细]
  • 为了优化直播应用底部聊天框的弹出机制,确保在不同设备上的布局稳定性和兼容性,特别是在配备虚拟按键的设备上,我们对用户交互流程进行了调整。首次打开应用时,需先点击首个输入框以准确获取键盘高度,避免直接点击第二个输入框导致的整体布局挤压问题。此优化通过调整 `activity_main.xml` 布局文件实现,确保了更好的用户体验和界面适配。 ... [详细]
  • Android 图像色彩处理技术详解
    本文详细探讨了 Android 平台上的图像色彩处理技术,重点介绍了如何通过模仿美图秀秀的交互方式,利用 SeekBar 实现对图片颜色的精细调整。文章展示了具体的布局设计和代码实现,帮助开发者更好地理解和应用图像处理技术。 ... [详细]
  • 如何在Android应用中设计和实现专业的启动欢迎界面(Splash Screen)
    在Android应用开发中,设计与实现一个专业的启动欢迎界面(Splash Screen)至关重要。尽管Android设计指南对使用Splash Screen的态度存在争议,但一个精心设计的启动界面不仅能提升用户体验,还能增强品牌识别度。本文将探讨如何在遵循最佳实践的同时,通过技术手段实现既美观又高效的启动欢迎界面,包括加载动画、过渡效果以及性能优化等方面。 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • 本文探讨了在Android应用中实现动态滚动文本显示控件的优化方法。通过详细分析焦点管理机制,特别是通过设置返回值为`true`来确保焦点不会被其他控件抢占,从而提升滚动文本的流畅性和用户体验。具体实现中,对`MarqueeText.java`进行了代码层面的优化,增强了控件的稳定性和兼容性。 ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
  • APKAnalyzer(1):命令行操作体验与功能解析
    在对apkChecker进行深入研究后,自然而然地关注到了Android Studio中的APK分析功能。将APK文件导入IDE中,系统会自动解析并展示其中各类文件的详细信息。官方文档提供了详细的命令行工具使用指南,帮助开发者快速上手。本文以一个RecyclerView的Adapter代理开源库为例,探讨了如何利用这些工具进行高效的APK分析。 ... [详细]
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • 技术分享:深入解析GestureDetector手势识别机制
    技术分享:深入解析GestureDetector手势识别机制 ... [详细]
  • 深入解析 Android Drawable:第六阶段进阶指南 ... [详细]
  • Android ListView 自定义 CheckBox 实现列表项多选功能详解
    本文详细介绍了在Android开发中如何在ListView的每一行添加CheckBox,以实现列表项的多选功能。用户不仅可以通过点击复选框来选择项目,还可以通过点击列表的任意一行来完成选中操作,提升了用户体验和操作便捷性。同时,文章还探讨了相关的事件处理机制和布局优化技巧,帮助开发者更好地实现这一功能。 ... [详细]
  • Android开发常见问题汇总(含Gradle解决方案)第二篇
    本文继续深入探讨Android开发中常见的问题及其解决方案,特别聚焦于Gradle相关的挑战。通过详细分析和实例演示,帮助开发者高效解决构建过程中的各种难题,提升开发效率和项目稳定性。 ... [详细]
author-avatar
快乐xin_yi
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有